package com.storm.lib.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


import org.keplerproject.luajava.LuaException;
import org.keplerproject.luajava.LuaObject;
import org.keplerproject.luajava.LuaState;
import org.keplerproject.luajava.LuaStateFactory;

import com.storm.lib.type.LuaType;
import com.storm.lib.vo.LuaObjectVo;


/**
 * 类功能:Lua调用
 * 
 * @author future
 * @version 2011-8-8
 */
public class LuaUtil {

	/**
	 * 方法功能:得到LuaState 更新时间:2011-8-8, 作者:future
	 * 
	 * @return
	 */
	public static LuaState getLuaState() {
		LuaState ls = LuaStateFactory.newLuaState();
		ls.openLibs();
		return ls;
	}

	/**
	 * 方法功能:方法调用
	 * 
	 * @author future 2011-10-15
	 * @param fileName
	 * @param methodName
	 * @param paras
	 * @return
	 */
	public static synchronized List<Object> call(String fileName, String methodName, LuaObjectVo paras) {
		LuaState ls = getLuaState();// 获得实例
		try {
			File luaFile = FileUtil.getUnderDataLuaFile(fileName);
			if(null==luaFile){
				System.out.println("未找到ai文件[ " + luaFile + " ]");
			}
			String path = luaFile.getPath();
			ls.LdoFile(path);// 加载文件
			ls.getField(LuaState.LUA_GLOBALSINDEX, methodName);// 方法
			ls.pushJavaObject(paras);// 压栈
			ls.pcall(1, 1, 0);// 调用
			ls.setField(LuaState.LUA_GLOBALSINDEX, LuaType.LUA_RESULT);
			LuaObject lo = ls.getLuaObject(LuaType.LUA_RESULT);
			System.out.println(lo.toString());
			LuaObjectVo vo = (LuaObjectVo) lo.getObject();
			return vo.getOutParas();
		} catch (LuaException e) {
			ExceptionUtil.processException(e);
		} finally {
			ls.close();
		}
		return null;
	}

	public static void main(String[] args) {
		// try {
		// LuaState ls = LuaStateFactory.newLuaState();
		// ls.openLibs();
		// ls.LdoFile("e:\\lua\\array.lua");
		//
		// ls.getField(LuaState.LUA_GLOBALSINDEX, "sum");// 找到方法名
		//
		// List<Object> list = new ArrayList<Object>();
		// list.add(1);
		// list.add(2);
		// list.add(3);
		// LuaObjectVo obj = new LuaObjectVo();
		// obj.setInParas(list);
		// ls.pushObjectValue(obj);
		//
		// ls.call(1, 1);
		//
		// ls.setField(LuaState.LUA_GLOBALSINDEX, "result");
		// LuaObject lo = ls.getLuaObject("result");
		// LuaObjectVo vo = (LuaObjectVo) lo.getObject();
		// System.out.println(vo.toString());
		//
		// ls.close();
		// } catch (Exception e) {
		// e.printStackTrace();
		// }

		// List<Object> list = new ArrayList<Object>();
		// list.add(1);
		// list.add(2);
		// list.add(3);
		// LuaObjectVo obj = new LuaObjectVo();
		// obj.setInParas(list);
		// List<Object> result = LuaUtil.call("array.lua", "sum", obj);
		// for (Object o : result) {
		// System.out.println(o.toString());
		// }

		// List<Object> paras = new ArrayList<Object>();
		// paras.add(0);
		// paras.add(0);
		// paras.add(40);
		// paras.add(40);
		// paras.add(35);
		// paras.add(8);
		// paras.add(1);
		// paras.add(3);
		// paras.add(1);
		// paras.add(3);
		// paras.add(1);
		// paras.add(14);
		// paras.add(2);
		// paras.add(2);
		// paras.add(2);
		// paras.add(0);
		// paras.add(3);
		// paras.add(1);
		//
		// LuaObjectVo obj = new LuaObjectVo();
		// obj.setInParas(paras);
		// List<Object> result = LuaUtil.call("tiaoshi.lua", "main", obj);
		// for (Object o : result) {
		// System.out.println(o.toString());
		// }

		LuaObjectVo obj = new LuaObjectVo();
		List<Object> paras = new ArrayList<Object>();
		paras.add(200);
		paras.add(300);
		// paras.add(RoleType.ROLE_R);
		obj.setInParas(paras);
		List<Object> list = LuaUtil.call("point.lua", "main", obj);
		List<Object> result = null;
		try {
			result = LuaUtil.call("tiaoshi.lua", "main", obj);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("sssssssss");
		for (Object o : result) {
			System.out.println(o.toString());
		}
	}
}
